// ts中加入了class关键字，并为其添加了类型注解和其他语法
class Person {}
// ts中的class，不仅提供了class的语法功能，也作为一种类型存在
// 这里的p可以看到，类型推断为Person
let p = new Person()

// 类成员的可见性有以下三种 1.public  2.protected  3.private
// 1.public标识共有的公开的可以被任何地方访问，是默认的属性，可以省略
// 2.protected：表示受保护的，仅对其所在类和子类可见，实例化对象就不可见
// 3.private：表示私有的，只在当前类中可见，对实例化对象和子类是不可见的

// 实例属性的初始化以及构造函数
class Person1 {
  // 声明成员 age，类型为 number（没有初始值）。
  age: number
  // 声明成员 gender，并设置初始值，此时，可省略类型注解（TS 类型推论 为 string 类型）
  gender = '男'
  x = 10
  y = 10

  // 构造函数
  // 成员初始化之后，才可以通过this.age来访问
  // 需要为构造函数指定类型注解，否则会隐式推断为any,同时构造函数不需要返回值类型
  constructor (age: number, gender: string) {
    this.age = age
    this.gender = gender
  }
  //   实例方法的类型注解和函数用法形同
  scale (n: number): void {
    this.x *= n
    this.y *= n
    console.log(this.x)
    console.log(this.y)
    console.log(this.age)
  }
}

let p1 = new Person1(188, '男')
p1.scale(5)

// 类的继承有两种方式 1.extends继承父类 2.implements实现接口
class Person2 extends Person1 {
  bark () {
    console.log('汪汪汪')
  }
}

let p2 = new Person2(28, '男')
p2.scale(3)
p2.bark()

interface Singable {
  sing(): void
  talk: string
}

class Person3 implements Singable {
  sing (): void {
    console.log('大河向东流')
  }
  talk: string
}
let p3 = new Person3()
p3.sing()
